package model.member;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;

import com.ibatis.sqlmap.client.SqlMapClient;

public class MemberDao {
	private SqlMapClient sqlMapClient;

	// 생성자를 통해서 객체를 주입받는다
	// -->기본정책 setMethod를 통한 주입이 아니라 생성자를 통한 주입
	public MemberDao(SqlMapClient sqlMapClient) {
		super();
		this.sqlMapClient = sqlMapClient;
	}

	// 기본생성자 : DI에서 무엇을 주입받을지 판단할수 없기에 존재
	// 존재하지 않을 경우 : Exception 발생확률이 존재한다. 미연에 방지하기위해 생성
	public MemberDao() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * 로그인하는 메서드 로그인 하는 회원은 1명이기에 queryForObject를 MemberVO로 캐스팅하여 사용.
	 */
	public MemberVO login(MemberVO vo) throws SQLException {
		return (MemberVO) sqlMapClient.queryForObject(	"member.login",
														vo);
	}

	/**
	 * 로그인시 해당 회원의 기념일 확인하는 메서드 로그인한 회원의 기념일은 2개 이기때문에 queryForList를 사용.ㄴ
	 */
	public List findAnniversarybyId(String id) throws SQLException {
		return sqlMapClient.queryForList(	"member.findAnniversarybyId",
											id);
	}

	/**
	 * 아이디 중복확인 동일한 아이디가 존재시 id 값을 반환 없으면 null을 반환
	 */
	public String idCheck(String id) throws SQLException {
		return (String) sqlMapClient.queryForObject("member.idCheck",
													id);
	}

	/**
	 * 이메일 중복확인 동일한 이메일 존재시 email 값을 반환 없으면 null을 반환
	 */
	public String emailCheck(String email) throws SQLException {
		System.out.println(email);
		return (String) sqlMapClient.queryForObject("member.emailCheck",
													email);
	}

	/**
	 * 관리자가 수정시 이메일 체크
	 * 
	 * @throws SQLException
	 */
	public String emailCheckByAdmin(MemberVO vo) throws SQLException {
		return (String) sqlMapClient.queryForObject("member.emailCheckByAdmin",
													vo);
	}

	/**
	 * 회원 가입
	 */
	public void registerMember(MemberVO vo) throws SQLException {
		sqlMapClient.insert("member.registerMember",
							vo);
	}

	/**
	 * 회원 가입시 기념일 등록
	 */
	public void registerAnniversary(AnniversaryVO vo) throws SQLException {
		sqlMapClient.insert("member.registerAnniversary",
							vo);
	}

	/**
	 * 회원정보수정
	 */
	public void updateMember(MemberVO vo) throws SQLException {
		sqlMapClient.update("member.updateMember",
							vo);
	}

	/**
	 * 회원 상세보기
	 */
	public MemberVO memberInfo(String id) throws SQLException {
		return (MemberVO) sqlMapClient.queryForObject(	"member.memberInfo",
														id);
	}

	/**
	 * 회원 정보 수정시 기념일 수정
	 */
	public void updateAnniversay(AnniversaryVO avo) throws SQLException {
		sqlMapClient.update("member.updateAnniversay",
							avo);
	}

	/**
	 * 회원들이 이름과 이메일로 아이디를 찾고자 할때
	 */
	public MemberVO findId(MemberVO vo) throws SQLException {
		return (MemberVO) sqlMapClient.queryForObject(	"member.findId",
														vo);
	}

	/**
	 * 회원들 정보수정시 이메일로 비밀번호를 바꾸고자 할 때
	 */
	public void changePass(MemberVO vo) throws SQLException {
		sqlMapClient.update("member.changePass",
							vo);
	}

	/**
	 * 아이디와 이메일을 통해서 아이디를 받아온다?ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
	 */
	public String findPassword(MemberVO vo) throws SQLException {
		return (String) sqlMapClient.queryForObject("member.findPassword",
													vo);
	}

	/**
	 * 관리자 모드시 모든회원들을 조회할 때 //getMemberList(페이징)으로 쓰지 않나?
	 */
	public List findAllMemberInfo() throws SQLException {
		return sqlMapClient.queryForList("member.findAllMemberInfo");
	}

	/**
	 * 관지자가 memberVO에 있는 값들을 업데이트 시키기위해서 사용
	 */
	public void updateMemberByAdmin(MemberVO vo) throws SQLException {
		sqlMapClient.update("member.updateMemberByAdmin",
							vo);
	}

	/**
	 * 관리자가 회원 수정시 기존에 작성한 레시피의 작성자 까지 바꾸기 위해 사용
	 */
	public void updateRecipeByAdmin(MemberVO vo) throws SQLException {
		sqlMapClient.update("recipe.updateRecipeByAdmin",
							vo);
	}

	/**
	 * 관리자가 Anniversary에 있는 값들을 업데이트 시키기위해서 사용
	 */
	public void updateAnniversayByAdmin(AnniversaryVO vo) throws SQLException {
		sqlMapClient.update("member.updateAnniversayByAdmin",
							vo);
	}

	/**
	 * 관리자가 회원들을 페이징으로 볼때 사용한다.
	 */
	public List<MemberVO> getMemberList(HashMap map) throws SQLException {
		return sqlMapClient.queryForList(	"member.getMemberList",
											map);
	}

	/**
	 * 페이징시 총 게시물수 구하기
	 */
	public int totalContent() throws SQLException {
		return (Integer) sqlMapClient.queryForObject("member.totalContent");
	}

	/**
	 * 회원 탈퇴
	 */
	public void deleteRecipeDesc(int rno) throws SQLException {
		sqlMapClient.delete("member.deleteRecipeDesc",
							rno);
	}

	public List selectAllRecipe(String mid) throws SQLException {
		return sqlMapClient.queryForList(	"member.selectAllRecipe",
											mid);
	}

	public void deleteRecipe(int rno) throws SQLException {
		sqlMapClient.delete("member.deleteRecipe",
							rno);
	}

	public void deleteAnniByMemberId(String mid) throws SQLException {
		sqlMapClient.delete("member.deleteAnniByMemberId",
							mid);
	}

	public void deleteMember(String mid) throws SQLException {
		System.out.println("Dao mid=" + mid);
		sqlMapClient.delete("member.deleteMember",
							mid);
	}

	// qnaboard의 mid로 작성된 글들 다 삭제
	public void deleteQnaBoardByMemberId(String mid) throws SQLException {
		sqlMapClient.delete("qnaBoard.deleteBoardByMemberId",
							mid);
	}

	// qnaboard의 mid로 작성된 댓글들 다 삭제
	public void deleteQna_Board_replyByMemberId(String bno) throws SQLException {
		sqlMapClient.delete("member.deleteQna_Board_replyByMemberId",
							bno);
	}

	// notice게시판 글 삭제
	public void deleteNoticeContent(String mid) throws SQLException {
		sqlMapClient.delete("member.deleteNoticeContent",
							mid);
	}

	// freeboard의 글 삭제
	public void deleteFreeContent(String mid) throws SQLException {
		sqlMapClient.delete("member.deleteFreeContent",
							mid);
	}

	// freeboard의 mid로 작성된 댓글들 다 삭제
	public void deleteFree_Board_replyByMemberId(String bno) throws SQLException {
		sqlMapClient.delete("member.deleteFree_Board_replyByMemberId",
							bno);
	}

	public void deleteFavorite(String mid) throws SQLException {
		sqlMapClient.delete("member.deleteFavorite",
							mid);
	}

	public void deleteRecipeReply(String mid) throws SQLException {
		sqlMapClient.delete("member.deleteRecipeReply",
							mid);
	}

	public void deleteRecipeGrade(String mid) throws SQLException {
		sqlMapClient.delete("member.deleteRecipeGrade",
							mid);
	}

	/**
	 * 사용자가 비밀번호 변경전에 기존비밀보호가 맞는지를 검사한다.
	 */
	public String checkPasswordById(MemberVO vo) throws SQLException {
		return (String) sqlMapClient.queryForObject("member.checkPasswordById",
													vo);
	}

	/**
	 * 사용자가 비밀번호를 변경할때
	 */
	public void changePasswordById(MemberVO vo) throws SQLException {
		sqlMapClient.update("member.changePassword",
							vo);
	}

	/**
	 * 관리자가 검색조건을 통해 회원을 찾기위해 사용하는 메서드
	 */
	public List searchByMemberInfo(HashMap map) throws SQLException {
		System.out.println(map);
		return sqlMapClient.queryForList(	"member.searchByMemberInfo",
											map);
	}

	/**
	 * 관리자가 검색조건을 통해 회원 찾을 경우 검색조건에 알맞은 총 게시물수를 가져오는 메서드
	 */
	public int totalContentByAdmin(MemberVO vo) throws SQLException {
		return (Integer) sqlMapClient.queryForObject(	"member.totalContentByAdmin",
														vo);
	}

	public void rankingDelete(int r_no) throws SQLException {
		sqlMapClient.delete("report.rankingDelete",
							r_no);
	}

}
